/**
 * 请勿将俱乐部专享资源复制给其他人，保护知识产权即是保护我们所在的行业，进而保护我们自己的利益
 * 即便是公司的同事，也请尊重 JFinal 作者的努力与付出，不要复制给同事
 * 
 * 如果你尚未加入俱乐部，请立即删除该项目，或者现在加入俱乐部：http://jfinal.com/club
 * 
 * 俱乐部将提供 jfinal-club 项目文档与设计资源、专用 QQ 群，以及作者在俱乐部定期的分享与答疑，
 * 价值远比仅仅拥有 jfinal club 项目源代码要大得多
 * 
 * JFinal 俱乐部是五年以来首次寻求外部资源的尝试，以便于有资源创建更加
 * 高品质的产品与服务，为大家带来更大的价值，所以请大家多多支持，不要将
 * 首次的尝试扼杀在了摇篮之中
 */

package controller.admin.base;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

import com.jfinal.core.Controller;
import com.jfinal.core.NotAction;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.ehcache.CacheKit;

import common.kit.WebKit;
import model.User;
import service.LoginService;

/**
 * 基础控制器，方便获取登录信息
 * 
 * 警告：由于 BaseController 中声明了 Account loginUser 属性，
 *      所以不能使用 FastControllerFactory 这类回收 Controller 的用法
 *      在 jfinal 3.5 发布以后，可以通过继承 _clear_() 方法来清除属性中的值
 *      才能使用 FastControllerFactory
 *      用户自己的 Controller 也是同样的道理
 *
 * 注意：
 * 需要 LoginSessionInterceptor 配合，该拦截器使用
 * setAttr("loginUser", ...) 事先注入了登录账户
 * 否则即便已经登录，该控制器也会认为没有登录
 *
 */
public class BaseAdminController extends Controller {

	@NotAction
	public User getLoginUser() {
		User loginUser = getAttr(LoginService.loginUserCacheName);
		return loginUser;
	}
	
	public Long getLoginUserId() {
		User loginUser = getAttr(LoginService.loginUserCacheName);
		return loginUser.getId() ;
	}


	@NotAction
	public boolean isAjaxRequest() {
		return "XMLHttpRequest".equalsIgnoreCase(getHeader("X-Requested-With"));
	}
	
	@NotAction
	protected Kv getParamKv() {
		Kv kv = Kv.create() ;
		for (Entry<String, String[]> entity : getParaMap().entrySet()) {
			if (StrKit.notBlank(entity.getValue()[0]) && !entity.getValue()[0].equals("null") ) {
				//多次传入的重复值只取第一个
				kv.set(entity.getKey(), entity.getValue()[0]);
			}
		}
		return kv ;
	}

	/**
	 * 跳转到全域名
	 */
	@NotAction
	public void redirectFullPath(String redirectUri){
		redirect(WebKit.getCtx(getRequest()) + redirectUri);
	}
	
	@NotAction
	public void renderFail() {
		renderFail("系统异常，请联系管理员");
	}
	
	public void renderFail(String err) {
		renderJson(Ret.fail().set("err" , err));
	}

	/**
	 * 清除用户缓存，在用户信息状态变更后应立即调用。
	 * 不清除cookie端的sessionId，不用再次登录。仅仅从数据库刷新用户信息
	 */
	@NotAction
	public void removeUserFromCache(){
		CacheKit.remove(LoginService.loginUserCacheName, getLoginUser().getStr("sessionId"));
	}
	
	protected <T> List<T> getModelList(Class<T> modelClass,String modelName, int total){
        List<T> resultList = new ArrayList<T>();   
        for (int i = 0; i < total; i++) {
        	resultList.add(getModel(modelClass, modelName + i ));
		}
        return resultList ;
    }
	
	protected <T> List<T> getModelList(Class<T> modelClass){
		int total = getParaToInt("total");
        return this.getModelList(modelClass, "x" , total);
    }
}


